package com.codeZ.SingletonPattern;

/**
 * @Author code_zhang
 * @Date 2024/6/15 16:04
 * 单例模式 - 懒汉式(线程安全)
 * 优点: 延迟加载, 减少内存开销 线程安全
 * 缺点: 对getInstance()方法加锁，并发度低
 */
public class SingletonPattern03 {

    // 1. 私有构造方法
    private SingletonPattern03() {
        System.out.println("懒汉式(线程安全)");
    }

    // 2. 静态方法获取实例
    private static SingletonPattern03 instance;

    /**
     * 由于synchronized的使用：getInstance() 方法的同步锁机制确保了对 instance 的创建和读取操作是原子性的
     * 也间接保证了可见性。也就是说，当一个线程创建了实例后，其他线程能够看到这个变化，
     * 因此在这个场景下，volatile 不是必须的。
     * 当一个线程在同步方法内部修改了 instance 的值（即创建了一个新的实例），这个修改对其他线程来说是可见的，
     * 因为其他线程在尝试进入同步方法之前必须等待当前线程释放锁。而一旦锁被释放，其他线程就能看到一个更新后的 instance 值。
     * @return SingletonPattern03
     */
    public static synchronized SingletonPattern03 getInstance() {
        if (instance == null) instance = new SingletonPattern03();
        return instance;
    }


}